# 函数参数
"""
形参：定义函数是传递的参数
    位置参数：func(a,b,c)
    默认参数：func(a=5,b=6,c=7)
    不定长位置参数：func(*args)
    不定长关键字参数：func(**kwargs)
实参：调用函数时传递的参数
    位置参数：根据函数定义的位置参数进行传值 func(1,2,3),
    关键字参数：根据变量名进行传参，顺序无要求 func(b=2,c=3,a=1)

参数传递顺序：

"""
def sum(a,b,c=11):
    return a+b+c

res = sum(5,8) # 根据位置传参数,c的值并未传递，但是依然能得到结果，c就是默认参数
print(res)
res1 = sum(b=1,a=2) # 关键字传参
print(res1)

res2 = sum(c=12,b=1,a=2) # 关键字传参,c的值也可以在调用时被改变
print(res2)

# *args:动态的收集用户传递的参数
def learn_args(*args):
    print(args,type(args))
    for i in args:
        print(i)


learn_args()
learn_args(1)
learn_args(1,2)
learn_args(1,2,3)

# **kwargs:动态的收集用户传递的关键字参数
def learn_kwargs(**kwargs):
    print(kwargs,type(kwargs))
    for kwarg in kwargs:
        print(kwarg)

learn_kwargs()
learn_kwargs(a='aa')
learn_kwargs(b='bb',c='cc')
learn_kwargs(e='ee',f='ff',g='gg')

# 参数传递顺序:位置参数>默认参数>不定长位置参数>不定长关键字参数
def pass_parameter(a,b=2,*args,**kwargs):
    print(a,b)
    print(args)
    print(kwargs)

pass_parameter(8,8,3,4,d=11,e=12)
pass_parameter(8,8,3,4,d=11,e=12)

def func(x,y=4,z=5):
    print(x,y,z)

func(11)
func(11,12)
func(11,12,13)
func(11,z=12)
func(11,z=12,y=13)

# 序列解包，打包过程
print('===========序列解包、打包=======')
super_stars = {
    '001':('周杰伦',35),
    '002':('萧敬腾',37),
    '003':('毛不易',24),
    '004':('任贤齐',34)
}
def print_boy(name,**kwargs):
    """不定长关键字参数"""
    print('{}喜欢的小鲜肉是：'.format(name))
    if isinstance(kwargs,dict):
        values = kwargs.values()
        for name,age in values:
            print('     {}的年龄是{}'.format(name,age))
print_boy('李白',**super_stars)

